<?php
	/**
	  * @package	MyTools
	  * @name		MSNGateway
	  * @brief		Clase para conectarse con un servidor de protocolo MSN
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2010-01-19
	  * @version	0.1.0
  	**/

	/*abstract*/ class MSNGateway extends MyDebuger implements MyVersions {
		/* version de la clase */
		private static $version			= 0;
		/* subversion de la clase */
		private static $subversion		= 1;
		/* numero de revision de la clase */
		private static $revision		= 0;

		/* direccion del servidor MSN */
		private $msnServer	= 'messenger.hotmail.com';
		/* puerto del servidor MSN */
		private $msnPort		= 1863;
		/* conexion con el servidor */
		private $conexion		= False;
		/* usuario msn */
		private $user			= False;
		/* contrasena msn */
		private $pass			= False;
		/* estado del usuario */
		private $userStatus	= False;
		/* clases necesarias */
		private $clasesNecesarias = Array('EmailValidator');

		public function __construct($debug = False) {
			/* creamos el padre */
			parent::__construct($debug, __CLASS__);
			/* ingresamos a un control de errores */
			try {
				/* mostramos un mensaje */
				$this->show('Verificando existencia de clases necesarias..', False);
				/* recorremos las clases necesarias */
				foreach ($this->clasesNecesarias AS $clase)
					/* verificamos que la clase exista */
					$this->verificarClase($clase);
				/* mostramos ok al mensaje */
				$this->showOK();
			/* capturamos mis excepciones */
			} catch (MyException $e) {
				/* mostramos el error */
				$this->show($e->getMensaje());
				/* matamos el proceso */
				die();
			}
		}

		public function __destruct() {
			/* matamos el padre */
			parent::__destruct();
		}

		public static final function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		public function setUser($user = Null) {
			/* almacenamos el usuario */
			$this->catchExceptions('saveUser', $user);
		}

		public function setPass($pass = Null) {
			/* almacenamos la contrasena */
			$this->catchExceptions('savePass', $pass);
		}

		public function setStatus($status = Null) {
			/* almacenamos el estado */
			$this->catchExceptions('saveStatus', $status);
		}

		public function login() {
			/* logueamos al usuario */
			$this->catchExceptions('loginUser');
			/* retornamos si se logro conectar */
			return $this->currentlyConnected();
		}

		private function saveUser($user = Null) {
			/* mostramos un mensaje */
			$this->show('Almacenando usuario..', False);
			/* verificamos si especifico el usuario */
			if ($user === Null)
				/* salimos con una excepcion */
				$this->newException('No se especifico el nombre de usuario');
			/* verificamos que el usuario sea valido */
			if (!EmailValidator::validateEmail($user))
				/* salimos con una excepcion */
				$this->newException('El nombre de usuario no es valido');
			/* almacenamos el usuario */
			$this->user = $user;
			/* mostramos ok al mensaje */
			$this->showOK();
		}

		private function savePass($pass = Null) {
			/* mostramos un mensaje */
			$this->show('Almacenando contrasena..', False);
			/* verificamos si especifico la contrasena */
			if ($pass === Null)
				/* salimos con una excepcion */
				$this->newException('No se especifico la contrasena');
			/* almacenamos la contrasena */
			$this->pass = $pass;
			/* mostramos ok al mensaje */
			$this->showOK();
		}

		private function saveStatus($status = Null) {
			/* mostramos un mensaje */
			$this->show('Especificando estado del usuario..', False);
			/* verificamos si especifico el estado */
			if ($status === Null)
				/* salimos con una excepcion */
				$this->newException('No se especifico el estado');
			/* verificamos si es un estado valido */
			if (!$this->validStatus($status))
				/* salimos con una excepcion */
				$this->newException('El estado especificado no es valido');
			/* almacenamos el estado */
			$this->userStatus = $status;
			/* mostramos ok al mensaje */
			$this->showOK();
			/* verificamos si ya estamos conectados */
			if ($this->currentlyConnected())
				/* actualizamos el estado */
				$this->updateUserStatus();
		}

		private function loginUser() {
			/** LOGIN DEL USUARIO **/
			$this->show($this->blue('LOGIN DEL USUARIO'));
		}

		private function validStatus($status) {
			/** retornamos si el estado es valido **/
			return True;
		}

		private function updateUserStatus() {
			/** ACTUALIZACION DEL ESTADO DEL USUARIO **/
			$this->show($this->blue('ACTUALIZACION DEL ESTADO DEL USUARIO'));
		}

		private function currentlyConnected() {
			/* retornamos si estamos conectados */
			return ($this->conexion === False ? False : True);
		}

		private function catchExceptions($method = Null) {
			/* ingresamos a un control de errores para capturar mis excepciones */
			try {
				/* ingresamos a un control de errores para capturar las excepciones de ejecucion */
				try {
					/* realizamos algunas verificaciones */
					$this->verificarMetodo($method);
					/* obtenemos los parametros recibidos */
					$args = func_get_args();
					/* llamamos al metodo con los parametros */
					call_user_func_array(Array(__CLASS__, $method), $this->buildArgs($args));
				/* capturamos las excepciones */
				} catch (Exception $e) {
					/* capturamos todos los errores y los transformamos en mi excepcion */
					$this->newException($e);
				}
			/* capturamos mis excepciones */
			} catch (MyException $e) {
				/* si se produjo una excepcion la manejamos con el metodo 'show' */
				$this->show($e->getMensaje());
			}
		}
	}
?>